#include "mainwidget.h"
#include "./ui_mainwidget.h"
#include"sessionfriendarea.h"
#include"selfinfowidget.h"
#include"sessiondetailwidget.h"
#include"groupsessiondetailwidget.h"
#include"debug.h"
#include"addfrienddialog.h"
#include"./model/datacenter.h"
#include"./model/data.h"
#include"./toast.h"

#include<QGridLayout>
#include<QLineEdit>
#include<QList>

MainWidget* MainWidget::instance = nullptr;

//单例模式：懒汉实现
MainWidget* MainWidget::getInstance(){
    if(instance == nullptr){
        //此处不传入参数，以桌面为父窗口
        //由于此处窗口是整个程序的主窗口，父窗口就设定为桌面，本身看就是常规设定
        instance = new MainWidget();
    }
    return instance;
}


MainWidget::MainWidget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::MainWidget)
{
    ui->setupUi(this);

    this->setWindowTitle("我的聊天室");
    this->setWindowIcon(QIcon(":/resource/image/logo.png"));

    //初始化主界面布局
    initMainWindow();
    //初始化左界面布局
    initLeftWindow();
    //初始化中间界面布局
    initMidWindow();
    //初始化右界面布局
    initRightWindow();
    //初始化信号槽
    initSignalSlot();
    //初始化websocket
    initWebsocket();
}

MainWidget::~MainWidget()
{
    delete ui;
}

void MainWidget::initMainWindow()
{
    //水平布局管理器
    QHBoxLayout* layout = new QHBoxLayout();
    //Spacing 就是layout内部元素之间的间隔距离，设为0就是"紧挨着"
    layout->setSpacing(0);
    //设置layout里面的元素距离四个边界的距离
    layout->setContentsMargins(0 , 0 , 0 , 0);

    this->setLayout(layout);

    windowLeft = new QWidget();
    windowMid = new QWidget();
    windowRight = new QWidget();

    //设置布局的宽度
    windowLeft->setFixedWidth(70);
    windowMid->setFixedWidth(310);
    windowRight->setMinimumWidth(800);

    windowRight->setMinimumHeight(700);
    //设置布局背景色
    windowLeft->setStyleSheet("QWidget { background-color: rgb(46,46,46); }");
    windowMid->setStyleSheet("QWidget { background-color: rgb(247,247,247); }");
    windowRight->setStyleSheet("QWidget { background-color: rgb(247,247,247); }");

    layout->addWidget(windowLeft);
    layout->addWidget(windowMid);
    layout->addWidget(windowRight);
}

void MainWidget::initLeftWindow()
{
    QVBoxLayout* layout = new QVBoxLayout();
    layout->setSpacing(20);
    layout->setContentsMargins(0,50,0,0);
    windowLeft->setLayout(layout);

    //添加用户头像
    userAvatar = new QPushButton();
    userAvatar->setFixedSize(45,45);
    userAvatar->setIconSize(QSize(30,30));
    userAvatar->setIcon(QIcon(":/resource/image/defaultAvatar.png"));
    userAvatar->setStyleSheet("QPushButton { background-color: transparent; } ");
    layout->addWidget(userAvatar,1,Qt::AlignTop | Qt::AlignHCenter);

    //添加会话标签页按钮
    sessionTabBtn = new QPushButton();
    sessionTabBtn->setFixedSize(45,45);
    sessionTabBtn->setIconSize(QSize(30,30));
    sessionTabBtn->setIcon(QIcon(":/resource/image/session_active.png"));
    sessionTabBtn->setStyleSheet("QPushButton { background-color: transparent; } ");
    layout->addWidget(sessionTabBtn,1,Qt::AlignTop | Qt::AlignHCenter);

    //添加好友标签页按钮
    friendTabBtn = new QPushButton();
    friendTabBtn->setFixedSize(45,45);
    friendTabBtn->setIconSize(QSize(30,30));
    friendTabBtn->setIcon(QIcon(":/resource/image/friend_inactive.png"));
    friendTabBtn->setStyleSheet("QPushButton { background-color: transparent; } ");
    layout->addWidget(friendTabBtn,1,Qt::AlignTop | Qt::AlignHCenter);

    //添加好友申请标签页按钮
    applyTabBtn = new QPushButton();
    applyTabBtn->setFixedSize(45,45);
    applyTabBtn->setIconSize(QSize(30,30));
    applyTabBtn->setIcon(QIcon(":/resource/image/apply_inactive.png"));
    applyTabBtn->setStyleSheet("QPushButton { background-color: transparent; } ");
    layout->addWidget(applyTabBtn,1,Qt::AlignTop | Qt::AlignHCenter);

    //创建一个空白区域，把按钮往上顶
    layout->addStretch(20);
}

void MainWidget::initMidWindow()
{
    //网格布局管理器
    QGridLayout* layout = new QGridLayout();
    //距离上方有20px的距离，另外三个方向都不要边距
    layout->setContentsMargins(0,20,0,0);
    layout->setHorizontalSpacing(0);
    layout->setVerticalSpacing(10);
    windowMid->setLayout(layout);

    //好友搜索框
    searchEdit = new QLineEdit();
    searchEdit->setFixedHeight(30);
    searchEdit->setPlaceholderText("搜索");
    searchEdit->setStyleSheet("QLineEdit { border-radius:5px; background-color: rgb(226, 226, 226); padding-left: 5px}");

    //添加好友按钮
    addFriendBtn = new QPushButton();
    addFriendBtn->setFixedSize(30,30);
    addFriendBtn->setIcon(QIcon(":/resource/image/cross.png"));
    QString style = "QPushButton { border-radius: 5px; background-color: rgb(226, 226, 226);}";
    style += "QPushButton:Pressed { background-color: rgb(240, 240, 240);}";
    addFriendBtn->setStyleSheet(style);

    //好友会话
    sessionFriendArea = new SessionFriendArea();

    //为了控制边框距离，这里需要创建空白widget占位
    QWidget* spacer1 = new QWidget();
    spacer1->setFixedWidth(10);
    QWidget* spacer2 = new QWidget();
    spacer2->setFixedWidth(10);
    QWidget* spacer3 = new QWidget();
    spacer3->setFixedWidth(10);

    //网格管理器添加widget
    layout->addWidget(spacer1,0,0);
    layout->addWidget(searchEdit,0,1);
    layout->addWidget(spacer2,0,2);
    layout->addWidget(addFriendBtn,0,3);
    layout->addWidget(spacer3,0,4);
    layout->addWidget(sessionFriendArea,1,0,1,5);
}

void MainWidget::initRightWindow()
{
    //1.创建右侧窗口的布局管理器
    QVBoxLayout* vlayout = new QVBoxLayout();
    vlayout->setSpacing(0);
    vlayout->setContentsMargins(0,0,0,0);
    vlayout->setAlignment(Qt::AlignTop);
    windowRight->setLayout(vlayout);

    //2.创建上方的标题栏
    QWidget* titleWidget = new QWidget();
    titleWidget->setFixedHeight(62);
    titleWidget->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Fixed);
    //使下面的样式设置只对titleWidget本身起作用,避免对内部的QWidget起作用
    titleWidget->setObjectName("titleWidget");
    titleWidget->setStyleSheet("#titleWidget {border-bottom: 1px solid rgb(230,230,230); border-left: 1px solid rgb(230,230,230);}");
    vlayout->addWidget(titleWidget);

    //3.给标题栏，添加标题 label 和 一个按钮
    QHBoxLayout* hlayout = new QHBoxLayout();
    hlayout->setSpacing(0);
    //使标题label和按钮距离左右两侧的边界有点间距
    hlayout->setContentsMargins(10,0,10,0);
    titleWidget->setLayout(hlayout);

    sessionTitleLabel = new QLabel();
    sessionTitleLabel->setStyleSheet("QLabel {font-size: 22px; border-bottom: 1px solid rgb(230,230,230);}");

#if TEST_UI
    //为了测试界面设置，实际这里的内容应该通过服务器获取数据设置
    sessionTitleLabel->setText("这是会话标题");
#endif

    hlayout->addWidget(sessionTitleLabel);

    extraBtn = new QPushButton();
    extraBtn->setFixedSize(30,30);
    extraBtn->setIconSize(QSize(30,30));
    extraBtn->setIcon(QIcon(":/resource/image/more.png"));
    extraBtn->setStyleSheet("QPushButton { border:none; background-color: rgb(245,245,245);} QPushButton:pressed {background-color: rgb(220,220,220);}");
    hlayout->addWidget(extraBtn);

    //消息展示区
    messageShowArea = new MessageShowArea();
    vlayout->addWidget(messageShowArea);

    //消息编辑区
    messageEditArea = new MessageEditArea();
    vlayout->addWidget(messageEditArea,0,Qt::AlignBottom);
}



void MainWidget::initSignalSlot()
{
    model::DataCenter* dataCenter = model::DataCenter::getInstance();

    //////////////////////////////////////////////////
    ////// 连接信号槽 处理标签页按钮切换问题
    //////////////////////////////////////////////////
    connect(sessionTabBtn,&QPushButton::clicked,this,&MainWidget::switchTabtoSessionList);
    connect(friendTabBtn,&QPushButton::clicked,this,&MainWidget::switchTabtoFriendList);
    connect(applyTabBtn,&QPushButton::clicked,this,&MainWidget::switchTabtoApplyList);


    //////////////////////////////////////////////////
    ////// 连接信号槽 处理标签页按钮切换问题
    //////////////////////////////////////////////////
    connect(userAvatar,&QPushButton::clicked,this,[=](){
        SelfInfoWidget* selfInfoWidget = new SelfInfoWidget(this);
        selfInfoWidget->exec();			//弹出模态对话框
    });


    //////////////////////////////////////////////////
    ////// 点击会话详情按钮，弹出会话详细窗口
    //////////////////////////////////////////////////
    connect(extraBtn,&QPushButton::clicked,this,[=](){
        //判断当亲会话是单聊还是群聊
        //这个bool变量，要根据当前选中的实际会话来确定，（后续接入服务器，获取实际数据之后）
//#if TEST_GROUP_SESSION_DETAIL
//    bool isSingleChat = false;
//#else
//    bool isSingleChat = true;
//#endif
    model::ChatSessionInfo* chatSessionInfo = dataCenter->findChatSessionByChatSessionId(dataCenter->getCurrentChatSessionId());
    if(chatSessionInfo == nullptr){
        LOG() << "当前会话不存在,无法弹出会话详情对话框";
        return ;
    }

    bool isSingleChat = chatSessionInfo->userId != "";

    if(isSingleChat){
        //单聊，弹出这个窗口
        model::UserInfo* userInfo = dataCenter->findFriendById(chatSessionInfo->userId);
        if(userInfo == nullptr){
            LOG() << "单聊会话对应的用户不存在,无法弹出会话详情窗口";
            return;
        }
        SessionDetailWidget* sessionDetailWidget = new SessionDetailWidget(this,*userInfo);
        sessionDetailWidget->exec();
    }else{
        //群聊，弹出这个窗口
        GroupSessionDetailWidget* groupsessionDetailWidget = new GroupSessionDetailWidget(this);
        groupsessionDetailWidget->exec();
    }   
    });


    //////////////////////////////////////////////////
    ////// 点击添加好友按钮，弹出好友申请详细窗口
    //////////////////////////////////////////////////
    connect(addFriendBtn,&QPushButton::clicked,this,[=](){
        AddFriendDialog* addFriendDialog = new AddFriendDialog(this);
        addFriendDialog->exec();
    });

    //////////////////////////////////////////////////
    ////// 修改搜索框内容,弹出添加好友对话框
    //////////////////////////////////////////////////
    connect(searchEdit,&QLineEdit::textEdited,this,[=](){
        //取出当前输入框的内容，设置到新弹窗的输入框内
        const QString& searchKey = searchEdit->text();
        AddFriendDialog* addFriendDialog = new AddFriendDialog(this);
        addFriendDialog->setSearchKey(searchKey);
        //清空输入主窗口的文本内容
        searchEdit->setText("");
        addFriendDialog->exec();
    });
    //////////////////////////////////////////////////
    ///// 获取个人信息
    //////////////////////////////////////////////////
    //当收到dataCenter获取到用户信息信号，将用户头像显示到界面上
    connect(dataCenter,&model::DataCenter::getMyselfDone,this,[=](){
        auto myself = dataCenter->getMyself();
        userAvatar->setIcon(myself->avatar);
    });
    //提供一个具体的方法，来获取到网络数据
    dataCenter->getMyselfAsync();
    
    //////////////////////////////////////////////////
    ///// 获取好友列表
    //////////////////////////////////////////////////
    loadFriendList();

    //////////////////////////////////////////////////
    ///// 获取会话列表
    //////////////////////////////////////////////////
    loadSessionList();

    //////////////////////////////////////////////////
    ///// 获得好友申请列表
    //////////////////////////////////////////////////
    loadSessionList();

    //////////////////////////////////////////////////
    ///// 处理修改头像
    //////////////////////////////////////////////////
    connect(dataCenter,&model::DataCenter::changeAvatarDone,this,[=](){
        model::UserInfo* myself = dataCenter->getMyself();
        userAvatar->setIcon(myself->avatar);
    });

    //////////////////////////////////////////////////
    ///// 处理删除好友
    //////////////////////////////////////////////////
    connect(dataCenter,&model::DataCenter::deleteFriendDone,this,[=](){
        //更新会话列表和好友列表
        this->updateFriendList();
        this->updateChatSessionList();
        LOG() << "删除好友完成";
    });

    connect(dataCenter,&model::DataCenter::clearCurrentSession,this,[=]{
        sessionTitleLabel->setText("");
        messageShowArea->clear();
        dataCenter->setCurrentChatSessionId("");
        LOG() << "清空当前会话完成";
    });

    //////////////////////////////////////////////////
    ///// 处理添加好友申请
    //////////////////////////////////////////////////
    connect(dataCenter,&model::DataCenter::addFriendApplyDone,this,[=](){
        Toast::showMessage("好友申请已发送");
    });

    //////////////////////////////////////////////////
    ///// 处理添加好友申请推送数据
    //////////////////////////////////////////////////
    connect(dataCenter,&model::DataCenter::receiveFriendApplyDone,this,[=](){
        this->updateApplyList();
        Toast::showMessage("收到新的好友申请");
    });

    //////////////////////////////////////////////////
    ///// 处理同意好友申请
    //////////////////////////////////////////////////
    connect(dataCenter,&model::DataCenter::acceptFriendApplyDone,this,[=](){
        this->updateApplyList();
        this->updateFriendList();
        Toast::showMessage("好友已经添加完成");
    });

    //////////////////////////////////////////////////
    ///// 处理拒绝好友申请
    //////////////////////////////////////////////////
    connect(dataCenter,&model::DataCenter::rejectFriendApplyDone,this,[=](){
        //需要更新好友申请列表,刚才拒绝的这一项需要删除掉
        this->updateApplyList();
        Toast::showMessage("好友已经拒绝");
    });

    //////////////////////////////////////////////////
    ///// 处理好友申请结果的推送数据
    //////////////////////////////////////////////////
    connect(dataCenter,&model::DataCenter::receiveFriendProcessDone,this,[=](const QString& nickname,bool agree){
        if(agree){
            //同意
            this->updateFriendList();
            Toast::showMessage(nickname + "已经同意你的好友申请");
        }else{
            //不同意
            Toast::showMessage(nickname + "已经拒绝了你的好友申请");
        }
    });

    //////////////////////////////////////////////////
    ///// 处理创建群聊的响应信息
    //////////////////////////////////////////////////
    connect(dataCenter,&model::DataCenter::createGroupChatSessionDone,this,[=](){
        Toast::showMessage("创建群聊会话请求已经发送!");
    });


    //////////////////////////////////////////////////
    ///// 处理创建会话的推送数据
    //////////////////////////////////////////////////
    connect(dataCenter,&model::DataCenter::receiveSessionCreateDone,this,[=](){
        this->updateChatSessionList();
        //通知用户,入群
        Toast::showMessage("您被拉入到新的群聊中");
    });

    //////////////////////////////////////////////////
    ///// 处理修改群聊名称的推送数据
    //////////////////////////////////////////////////
    connect(dataCenter,&model::DataCenter::changeGroupNameDone,this,[=](const QString& chatSessionId){
        this->updateChatSessionList();
        this->updateRecentMessage(chatSessionId);
    });

}

void MainWidget::initWebsocket()
{
    model::DataCenter* dataCenter = model::DataCenter::getInstance();
    dataCenter->initWebsocket();
}


void MainWidget::switchTabtoSessionList()
{
    //标签状态变更
    activetab = SESSION_LIST;

    //变更对应标签页状态图标,会话标签页激活
    sessionTabBtn->setIcon(QIcon(":/resource/image/session_active.png"));
    friendTabBtn->setIcon(QIcon(":/resource/image/friend_inactive.png"));
    applyTabBtn->setIcon(QIcon(":/resource/image/apply_inactive.png"));

    //在窗口的中间部分加载会话列表数据
    this->loadSessionList();
}

void MainWidget::switchTabtoFriendList()
{

    //标签状态变更
    activetab = FRIEND_LIST;

    //变更对应标签页状态图标,好友标签页激活
    sessionTabBtn->setIcon(QIcon(":/resource/image/session_inactive.png"));
    friendTabBtn->setIcon(QIcon(":/resource/image/friend_active.png"));
    applyTabBtn->setIcon(QIcon(":/resource/image/apply_inactive.png"));

    //在窗口的中间部分加载好友列表数据
    this->loadFriendList();
}

void MainWidget::switchTabtoApplyList()
{

    //标签状态变更
    activetab = APPLY_LIST;

    //变更对应标签页状态图标,会话标签页激活
    sessionTabBtn->setIcon(QIcon(":/resource/image/session_inactive.png"));
    friendTabBtn->setIcon(QIcon(":/resource/image/friend_inactive.png"));
    applyTabBtn->setIcon(QIcon(":/resource/image/apply_active.png"));

    //在窗口的中间部分加载会话列表数据
    this->loadApplyList();
}

//加载会话列表
void MainWidget::loadSessionList()
{
    //首先需要判定DataCenter中是否已经有数据了，如果有数据，直接加载本地数据
    //如果没有数据，从服务器获取
    model::DataCenter* dataCenter = model::DataCenter::getInstance();
    if(dataCenter->getChatSessionList() != nullptr){
        //从内存加载数据显示
        updateChatSessionList();
    }
    else{
        //从网络加载数据
        connect(dataCenter,&model::DataCenter::getChatSessionListDone,this,&MainWidget::updateChatSessionList,Qt::UniqueConnection);
        dataCenter->getChatSessionListAsync();
    }
}

//加载好友申请列表
void MainWidget::loadFriendList()
{
    //好友申请列表数据是在DataCenter中存储的
    //首先需要判定DataCenter中是否已经有数据了，如果有数据，直接加载本地数据
    //如果没有数据，从服务器获取
    model::DataCenter* dataCenter = model::DataCenter::getInstance();
    if(dataCenter->getFriendList() != nullptr){
        //从内存这个列表中加载数据
        updateFriendList();
    }
    else{
        //通过网络加载数据
        connect(dataCenter,&model::DataCenter::getFriendListDone,this,&MainWidget::updateFriendList,Qt::UniqueConnection);
        dataCenter->getFriendListAsync();
    }

}

//加载好友申请列表
void MainWidget::loadApplyList()
{
    //首先需要判定DataCenter中是否已经有数据了，如果有数据，直接加载本地数据
    //如果没有数据，从服务器获取
    model::DataCenter* dataCenter = model::DataCenter::getInstance();
    if(dataCenter->getApplyList() != nullptr){
        //从内存加载数据显示
        updateApplyList();
    }
    else{
        //从网络加载数据
        connect(dataCenter,&model::DataCenter::getApplyListDone,this,&MainWidget::updateApplyList,Qt::UniqueConnection);
        dataCenter->getApplyListAsync();
    }

}


void MainWidget::updateFriendList()
{
    if(activetab != FRIEND_LIST){
        //当前的标签页不是"好友列表"，就不需要渲染任何数据到界面上
        return;
    }
    model::DataCenter* dataCenter = model::DataCenter::getInstance();
    QList<model::UserInfo>* friendList = dataCenter->getFriendList();
    
    //清空一下之前界面上的数据
    sessionFriendArea->clear();    
    
    //遍历好友列表，添加到界面上
    for(const auto& f : *friendList){
        sessionFriendArea->addItem(FriendItemType,f.userId,f.avatar,f.nickname,f.description);
    }
}

void MainWidget::updateChatSessionList()
{
    if(activetab != SESSION_LIST){
        //当前的标签页不是"会话列表"，就不需要渲染任何数据到界面上
        return;
    }
    model::DataCenter* dataCenter = model::DataCenter::getInstance();
    QList<model::ChatSessionInfo>* chatSessionList = dataCenter->getChatSessionList();

    //清空一下之前界面上的数据
    sessionFriendArea->clear();

    //遍历会话列表，添加到界面上
    for(const auto& c : *chatSessionList){
        if(c.lastMessage.messageType == model::TEXT_TYPE){
            sessionFriendArea->addItem(SessionItemType,c.chatSessionId,c.avator,c.chatSessionName,c.lastMessage.content);
        }
        else if(c.lastMessage.messageType == model::IMAGE_TYPE){
            sessionFriendArea->addItem(SessionItemType,c.chatSessionId,c.avator,c.chatSessionName,"[图片]");
        }
        else if(c.lastMessage.messageType == model::FILE_TYPE){
            sessionFriendArea->addItem(SessionItemType,c.chatSessionId,c.avator,c.chatSessionName,"[文件]");
        }
        else if(c.lastMessage.messageType == model::SPEECH_TYPE){
            sessionFriendArea->addItem(SessionItemType,c.chatSessionId,c.avator,c.chatSessionName,"[语音]");
        }
        else{
            LOG() << "错误的消息类型！messageYype=" << c.lastMessage.messageType;
        }
    }
}

void MainWidget::updateApplyList()
{
    if(activetab != APPLY_LIST){
        //当前的标签页不是"好友申请列表"，就不需要渲染任何数据到界面上
        return;
    }
    model::DataCenter* dataCenter = model::DataCenter::getInstance();
    QList<model::UserInfo>* applyList = dataCenter->getApplyList();

    //清空一下之前界面上的数据
    sessionFriendArea->clear();

    //遍历好友列表，添加到界面上
    for(const auto& a : *applyList){
        //直接把UserInfo对象添加到界面上即可，不涉及到PB到自己结构之间的转换
        //此处UserInfo的description不需要填写进来，好友申请列表，不显示用户的签名(这个位置被替换成两个按钮)
        sessionFriendArea->addItem(ApplyItemType,a.userId,a.avatar,a.nickname,"");
    }
}

void MainWidget::loadRecentMessage(const QString &chatSessionId)
{
    //首先需要判定DataCenter中是否已经有数据了，如果有数据，直接加载本地数据
    //如果没有数据，从服务器获取
    model::DataCenter* dataCenter = model::DataCenter::getInstance();

    if(dataCenter->getRecentMessageList(chatSessionId) != nullptr){
       //拿着本地数据更新界面
        updateRecentMessage(chatSessionId);
    }
    else{
        //本地没有数据，从网络加载
        connect(dataCenter,&model::DataCenter::getRecentMessageListDone,this,&MainWidget::updateRecentMessage,Qt::UniqueConnection);
        dataCenter->getRecentMessageListAsync(chatSessionId,true);
    }

}

void MainWidget::updateRecentMessage(const QString &chatSessionId)
{
    //1.拿着该会话的最近消息列表
    model::DataCenter* dataCenter = model::DataCenter::getInstance();
    auto* recentMessageList = dataCenter->getRecentMessageList(chatSessionId);

    //2.清空原有界面上显示的消息列表
    messageShowArea->clear();

    //3.根据当前拿到的消息列表，显示到界面上
    //因为用户首先看到应该是"最近"的消息，所以这里采用头插的方式
    for(int i= recentMessageList->size() - 1;i >= 0;--i){
        const model::Message& message = recentMessageList->at(i);
        bool isLeft = message.sender.userId != dataCenter->getMyself()->userId;
        messageShowArea->FontaddWidget(isLeft,message);
    }

    //4.设置会话标题
    model::ChatSessionInfo* chatSessionInfo = dataCenter->findChatSessionByChatSessionId(chatSessionId);
    if(chatSessionInfo != nullptr){
        //把会话名称显示到界面上
        sessionTitleLabel->setText(chatSessionInfo->chatSessionName);
    }

    //5.保存当前选中的会话是哪一个
    dataCenter->setCurrentChatSessionId(chatSessionId);

    //6.自动把滚动条，滚动到末尾
    messageShowArea->scrollToEnd();
}

void MainWidget::switchSession(const QString &userId)
{
    //1.在会话列表中，先找到对应的会话元素
    model::DataCenter* dataCenter = model::DataCenter::getInstance();
    model::ChatSessionInfo* chatSessionInfo = dataCenter->findChatSessionByUserId(userId);
    if(chatSessionInfo == nullptr){
        //正常来说，每个好友都会有一个对应的会话(哪怕从来没说过话)
        //添加好友的时候，就创建出来的会话
        LOG() << "[严重错误]当前选中的好友，对应的会话不存在";
        return;
    }
    //2.把选中的会话置顶，把这个会话信息放到整个会话列表的第一个位置
    //后续界面显示的时候，就是按照列表的顺序，从前往后显示的
    dataCenter->topChatSessionInfo(*chatSessionInfo);

    //3.切换到会话列表标签页
    switchTabtoSessionList();

    //4.加载到这个会话对应的历史消息,刚刚做了一个"置顶操作",被选中的好友的会话，在会话列表的最前头，也就是0号下标
    sessionFriendArea->clickItem(0);

}

MessageShowArea *MainWidget::getMessageShowArea()
{
    return messageShowArea;
}


